/**
 * 
 */
package com.xpec.c4.game.cronjob;

import org.quartz.JobKey;

import com.xpec.c4.game.utility.GameUtility;
import com.xpec.c4.service.module.BasicServiceModule;
import com.xpec.c4.service.module.task.TaskObject;

/**
 * 在 {@link BasicServiceModule} 中指定特定時間點執行的 task class<br>
 * 參考: {@link BasicServiceModule#addCronTaskTimer(CronTaskTimer, String)}
 * 
 * @author TW15010
 */
public abstract class CronTaskTimer extends TaskObject {
	/**
	 * 存取 job 用的 key
	 */
	private JobKey jobKey;

	/**
	 * 一直重複執行
	 */
	public static final int LOOP = -1;

	/**
	 * 要執行的cron表達式
	 */
	private String cronExpressions;
	
	/**
	 * 執行幾次後結束, 如果要一直重複執行就填 {@link CronTaskTimer#LOOP}
	 */
	private int runCount = LOOP;
	
	/**
	 * 這次觸發的時間，不須設定 (毫秒)
	 */
	private long fireTime;
	
	/**
	 * 上次觸發的時間，不需設定(毫秒)
	 */
	private long lastFireTime;
	
	/**
	 * 下次觸發時間，不需設定(毫秒)
	 */
	private long nextFireTime;

	@Override
	public void procTask() throws Exception {
		execute();
	}

	public JobKey getJobKey() {
		return jobKey;
	}

	public void setJobKey(JobKey jobKey) {
		this.jobKey = jobKey;
	}

	public int getRunCount() {
		return runCount;
	}

	public void setRunCount(int runCount) {
		this.runCount = runCount;
	}
	
	public String getCronExpressions() {
		return cronExpressions;
	}

	public void setCronExpressions(String cronExpressions) {
		this.cronExpressions = cronExpressions;
	}

	/**
	 * 取得這次觸發的時間 (毫秒) </br>
	 * @return
	 */
	public long getFireTime() {
		return fireTime;
	}
	
	/**
	 * 取得這次觸發的時間 (毫秒) </br>
	 * @return
	 */
	public long getFireTimeSec() {
		return GameUtility.transformTimeMilliToSec(fireTime);
	}

	/**
	 * 設定這次觸發時間，不需要設定 </br>
	 * {@link #CronTaskExecuteJob#execute()}
	 * @param fireTime
	 */
	protected void setFireTime(long fireTime) {
		this.fireTime = fireTime;
	}

	/**
	 * 取得上次觸發時間 (毫秒) </br>
	 * @return
	 */
	public long getLastFireTime() {
		return lastFireTime;
	}
	
	/**
	 * 取得上次觸發時間 (秒) </br>
	 * @return
	 */
	public long getLastFireTimeSec(){
		return GameUtility.transformTimeMilliToSec(lastFireTime);
	}

	/**
	 * 設定下次觸發時間，不需要設定 </br>
	 * {@link #CronTaskExecuteJob#execute()}
	 * @param fireTime
	 */
	protected void setNextFireTime(long nextFireTime) {
		this.nextFireTime = nextFireTime;
	}
	
	/**
	 * 取得下次觸發時間 (毫秒) </br>
	 * @return
	 */
	public long getNextFireTime() {
		return nextFireTime;
	}
	
	/**
	 * 取得下次觸發時間 (秒) </br>
	 * @return
	 */
	public long getNextFireTimeSec(){
		return GameUtility.transformTimeMilliToSec(nextFireTime);
	}

	/**
	 * 設定上次觸發時間，不需要設定 </br>
	 * {@link #CronTaskExecuteJob#execute()}
	 * @param fireTime
	 */
	protected void setLastFireTime(long lastFireTime) {
		this.lastFireTime = lastFireTime;
	}

	/**
	 * 是否是第一次觸發Timer
	 * @return
	 */
	protected boolean isFirstFire(){
		if (lastFireTime == 0) {
			return true;
		}
		return false;
	}

}
